home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / recio212.zip / rbget.c < prev    next >
C/C++ Source or Header  |  1995-01-29  |  4KB  |  111 lines

  1. /*****************************************************************************
  2.    MODULE: rbget.c
  3.   PURPOSE: recio character delimited integral number input functions
  4. COPYRIGHT: (C) 1994-1995, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.12
  8.   RELEASE: January 29, 1995
  9. *****************************************************************************/
  10.  
  11. #include <ctype.h>
  12. #include <errno.h>
  13. #include <limits.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17.  
  18. #include "recio.h"
  19.  
  20. extern int _risready(REC *rp, int mode);
  21. extern char *_rfldstr(REC *rp, size_t len);
  22. extern char *_rerrs(REC *rp, int errnum);
  23. extern unsigned long str2ul(const char *nptr, char **endptr, int base);
  24.  
  25. #define uint      unsigned int
  26. #define ulong     unsigned long
  27. #define UNSIGNED  0
  28. #define SIGNED    1
  29.  
  30. /****************************************************************************/
  31. static long                  /* return integral number                      */
  32.     _rbgetl(                 /* get integral number from record stream      */
  33.         REC *rp,             /* record pointer                              */
  34.         int base,            /* radix of number                             */
  35.         int sign,            /* signed number? (0=unsigned; !0=signed)      */
  36.         long min,            /* inclusive valid min value (0 if unsigned)   */
  37.         long max)            /* inclusive valid max value                   */
  38. /****************************************************************************/
  39.     long result=0L;          /* result to return */
  40.     long val;                /* conversion value */
  41.     char *fldptr;            /* pointer to field string */
  42.     char *endptr;            /* pointer to first invalid field char */
  43.  
  44.     if (_risready(rp, R_READ)) { 
  45.       fldptr = _rfldstr(rp, 0); 
  46.       if (fldptr) {
  47.         strims(fldptr);
  48.         for (;;) { 
  49.           if (*fldptr != '\0') { 
  50.             endptr = fldptr; 
  51.             errno = 0; 
  52.             if (sign) {
  53.               val = strtol(fldptr, &endptr, base); 
  54.             } else {
  55.               val = str2ul(fldptr, &endptr, base); 
  56.             }
  57.             while (isspace(*endptr)) endptr++; 
  58.             if (errno==ERANGE || !*endptr) { 
  59.               if (!errno) { 
  60.                 if (sign) {
  61.                   if (val >= min && val <= max) { 
  62.                     result = val; 
  63.                     goto done; 
  64.                   }
  65.                 } else {
  66.                   /* note: unsigned min always assumed to be zero */
  67.                   if ((ulong) val <= (ulong) max) {
  68.                     result = val; 
  69.                     goto done;
  70.                   }
  71.                 }
  72.               } /* data out of range */ 
  73.               fldptr = _rerrs(rp, R_ERANGE); 
  74.               if (fldptr) { continue; } else { goto done; } 
  75.             } /* invalid data */ 
  76.             fldptr = _rerrs(rp, R_EINVDAT); 
  77.             if (fldptr) { continue; } else { goto done; } 
  78.           } /* missing data */ 
  79.           fldptr = _rerrs(rp, R_EMISDAT); 
  80.           if (fldptr) { continue; } else { goto done; } 
  81.         } 
  82.       }
  83.     }
  84. done:
  85.     return result;
  86. }
  87.  
  88. /****************************************************************************/
  89. /* character delimited integral number input functions                      */
  90. /****************************************************************************/
  91. int rbgeti(REC *rp, int base)
  92. {
  93.     return (int) _rbgetl(rp, base, SIGNED, INT_MIN, INT_MAX);
  94. }
  95.  
  96. unsigned int rbgetui(REC *rp, int base)
  97. {
  98.     return (uint) _rbgetl(rp, base, UNSIGNED, 0, UINT_MAX);
  99. }
  100.  
  101. long rbgetl(REC *rp, int base)
  102. {
  103.     return _rbgetl(rp, base, SIGNED, LONG_MIN, LONG_MAX);
  104. }
  105.  
  106. unsigned long rbgetul(REC *rp, int base)
  107. {
  108.     return (ulong) _rbgetl(rp, base, UNSIGNED, 0L, ULONG_MAX);
  109. }
  110.